package lol.clann.minecraft.springboot.api.annotation.command;

import lol.clann.minecraft.springboot.api.bukkit.command.TabComplete;
import lol.clann.minecraft.springboot.api.bukkit.command.constant.CommandConcurrentLevelEnum;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *
 * @author pyz
 * @date 2019/5/6 10:30 PM
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Command {
    /**
     * 是否将方法名拼接在mapping前面
     *
     * @return
     */
    boolean useMethodNameAsFirtMapping() default true;

    /**
     * 指令前缀
     *
     * @return
     */
    String mapping() default "";

    /**
     * 展示给玩家看的参数列表
     *
     * @return
     */
    String showArgs() default "";

    /**
     * 指令介绍
     * 支持从配置文件解析${...}占位符
     * @return
     */
    String des() default "";//介绍

    /**
     * 是否解析颜色字符
     *
     * @return
     */
    boolean resolveColorCode() default false;

    /**
     * 是否需要OP权限
     *
     * @return
     */
    boolean onlyOp() default true;  //false:给非OP玩家执行

    /**
     * 所需权限
     *
     * @return
     */
    String permission() default ""; //所需权限

    /**
     * 是否必须玩家才能执行
     *
     * @return
     */
    boolean onlyPlayer() default false;//true:必须玩家才能执行

    /**
     * 是否只能控制台执行
     *
     * @return
     */
    boolean onlyConsole() default false;

    /**
     * 指令执行冷却时间(对于同一个执行者而言)
     * @return
     */
    long cooldown() default -1;

    /**
     * 拥有此权限的玩家不受冷却限制
     * @return
     */
    String cooldownExecludePermission() default "";

    /**
     * 是否异步执行
     *
     * @return
     */
    boolean async() default false;

    /**
     * 控制指令的并发程度
     * 默认无任何限制
     *
     * NONE:无限制
     * ALL:同时只能有一个在执行
     * SENDER:对于同一个执行者而言,只能有一个正在执行
     *
     * @return
     */
    CommandConcurrentLevelEnum concurrentLevel() default CommandConcurrentLevelEnum.NONE;

    /**
     * 自定义tab补全的提供者
     *
     * @return
     */
    Class<? extends TabComplete> tabComplete() default TabComplete.class;
}
